package com.oracle.controller;


import com.oracle.common.PageUtil;
import com.oracle.common.R;
import com.oracle.common.TaskTypeEnums;
import com.oracle.entity.*;
import com.oracle.service.*;
import com.oracle.util.DateUtil;
import com.oracle.vo.req.TaskVo;
import com.oracle.vo.resp.TaskRespVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author
 * @since 2025年05月15日
 */
@RestController
@RequestMapping("/task")
public class TaskController {

    //成员变量
    //C js语言中 全局变量
    @Autowired
    private TaskService taskService;

    @Autowired
    private Leave2Service leaveService;

    @Autowired
    private OauserService oauserService;

    @Autowired
    private DeptService deptService;

    //通用 对象
    @Autowired
    private RedisTemplate redisTemplate;

    //针对字符串
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private TaskTypeService taskTypeService;

    /**
     * 加载任务类型到redis
     */
    private void loadTaskTypeInfos(){
        taskTypeService.findAll();
    }

    /**
     * 查看详情
     * @param id
     * @return
     */
    @GetMapping("/findTaskById")
    public R findTaskById(Integer id){

        //封装返回值对象
        TaskRespVo taskRespVo = new TaskRespVo();

        //1、查看任务
        Task task = taskService.findTaskById(id);
        //2、根据任务类型 查看对应数据信息
        //2.1 请假类型
        if(TaskTypeEnums.TaskTypeEnums1.getTaskTypeId() == task.getTaskid()){
            //2.1.1 取得 请假申请信息
            Leave2 leaveInfo = leaveService.findInfoById(task.getTaskid());
            //2.1.2 获取申请人姓名
            //空指针
            //1、对象为null 打点调用
            //2、参数为null
            Oauser user = oauserService.findUserById(leaveInfo.getUserid());
            //2.1.3 获取申请人所在部门
            Dept dept = deptService.findDeptById(leaveInfo.getDeptid());
            //2.1.4 获取申请人请假类型
            // 将常用数据类型 存入 缓存中
            // 从redis中取出对应映射map 根据任务id 获取对应的任务类型
            Map<Integer,String> taskTypeMap3 = (Map<Integer,String>)redisTemplate.boundHashOps("taskTypeMap3").entries();
            String taskTypeName = taskTypeMap3.get(task.getTypeid());

            //2.1.5 获取审批人
            Oauser admin = oauserService.findUserById(leaveInfo.getAdminid());

            //3、封装返回数据
            taskRespVo.setRealname(user.getTruename());
            taskRespVo.setDeptname(dept.getName());
            taskRespVo.setStartTime(leaveInfo.getStarttime());
            taskRespVo.setEndTime(leaveInfo.getEndtime());
            taskRespVo.setDays(getDays(taskRespVo.getStartTime(),taskRespVo.getEndTime()));    //理论上应该是系统自动计算
            taskRespVo.setTaskTypeName(taskTypeName);
            taskRespVo.setRemark(leaveInfo.getRemark());
            taskRespVo.setAdminName(admin.getTruename());
            taskRespVo.setSubtime(task.getSubtime());

            //2.2 出差类型
        }else if(TaskTypeEnums.TaskTypeEnums2.getTaskTypeId()  == task.getTaskid()){

            //2.3 用车管理
        }else if(TaskTypeEnums.TaskTypeEnums3.getTaskTypeId()  == task.getTaskid()){
            //2.4 用章管理
        }else if(TaskTypeEnums.TaskTypeEnums4.getTaskTypeId()  == task.getTaskid()){
            //2.5 图书借阅
        }else if(TaskTypeEnums.TaskTypeEnums5.getTaskTypeId()  == task.getTaskid()){
            //2.6 名片印刷
        }else if(TaskTypeEnums.TaskTypeEnums6.getTaskTypeId()  == task.getTaskid()){
            //2.7 收入证明
        }else if(TaskTypeEnums.TaskTypeEnums7.getTaskTypeId()  == task.getTaskid()){
            //2.8 会议室管理
        }else if(TaskTypeEnums.TaskTypeEnums8.getTaskTypeId()  == task.getTaskid()){

        }

        return R.success(taskRespVo);
    }

    //日期计算
    private int getDays(String startTime,String endTime){
        Date startDate = DateUtil.str2Date(startTime);
        Date endDate = DateUtil.str2Date(endTime);

        //計算日期
        return DateUtil.d1SubD2(startDate,endDate);
    }

    @GetMapping("/findAll")
    public R findAll(){
        return R.success(taskService.findAll());
    }

    @PostMapping("/updateTaskStatus")
    public R updateTaskStatus(@RequestBody Task task){

        try {
            taskService.updateTaskStatus(task);
        } catch (Exception e) {
            return R.failed(null);
        }

        return R.success(null);
    }

    @PostMapping("/search")
    public R search(@RequestBody TaskVo taskVo,@RequestParam("pageNo") Integer pageNo,@RequestParam("pageSize") Integer pageSize){

        //局部变量
        //当首次被加载的时候
        int currentPage = 1;
        int pagelength = 10;

        //增加系统健壮性
        //当页面被首次加载时 页码为null
        if(!ObjectUtils.isEmpty(pageNo)){
            currentPage = pageNo;
        }

        if(!ObjectUtils.isEmpty(pageSize)){
            pagelength = pageSize;
        }

        PageUtil result = taskService.search(taskVo, currentPage, pagelength);

        //存入缓存服务器
        saveTaskType2Redis();

        return R.success(result);
    }

    /**
     * 将任务类型列表 存入redis缓存服务器
     */
    private void saveTaskType2Redis(){
        //1、当首页加载时 查询任务类型列表 并存入redis
        List<TaskType> taskTypeList = taskTypeService.findAll();
        Map<Integer,String> taskTypeMap = new HashMap<Integer,String>();
        //1、for-each
//        for (TaskType taskType : taskTypeList) {
//
//        }

        //2、普通循环
//        for (int i=0;i<x.length;i++) {
//
//        }

        //3、lambda 表达式
        taskTypeList.forEach(x -> {
            //将每个元素装入到 map中
            taskTypeMap.put(x.getId(),x.getName());
        });

        //方式1：存入redis
//        redisTemplate.opsForValue().set("taskTypeMap",taskTypeMap);
        //如果有时效性 需要加超时时间
//        redisTemplate.opsForValue().set("taskTypeMap",taskTypeMap,1000, TimeUnit.MINUTES);

        //方式2：存入redis
//        redisTemplate.boundHashOps("taskTypeMap2").put("taskType",taskTypeMap);
//        redisTemplate.boundHashOps("taskTypeMap2").expire(1000,TimeUnit.MINUTES);

        //方式3：存入redis
        redisTemplate.boundHashOps("taskTypeMap3").putAll(taskTypeMap);
//        redisTemplate.boundHashOps("taskTypeMap2").expire(1000,TimeUnit.MINUTES);

    }


    @GetMapping("/findPage")
    public R findPage(Integer pageNo,Integer pageSize){
        //局部变量
        //当首次被加载的时候
        int currentPage = 1;
        int pagelength = 10;

        //增加系统健壮性
        //当页面被首次加载时 页码为null
        if(!ObjectUtils.isEmpty(pageNo)){
            currentPage = pageNo;
        }

        if(!ObjectUtils.isEmpty(pageSize)){
            pagelength = pageSize;
        }

        return R.success(taskService.findPage(currentPage,pagelength));
    }

}
